package project01;

import java.util.Scanner;

public class FuBen {
    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);

        //初始化菜品信息
        System.out.println("请输入数组的长度：");
        int length = scan.nextInt();
        String[] food = new String[length];
        double[] price = new double[length];
        int[] likes = new int[length];

        for (int i = 0; i < food.length; i++) {
            // while(i<food.length) {
            System.out.println("请输入菜名：");
            food[i] = scan.next();
            System.out.println("请输入其单价：");
            price[i] = scan.nextDouble();
            //    break;
            // }
        }

        //定义一个订餐人姓名数组
        String[] name = new String[length];

        //定义一个点餐人所点的份数的数组（需要么？）
        int[] fennum = new int[length];

        //定义了一个送餐时间的数组
        int[] sDate = new int[length];

        //定义一个顾客地址的数组
        String[] address = new String[length];

        //补充一个数组（所订餐及份数）
        String[] dishMegs = new String[length];

        //定义一个数组（计算总金额）
        double[] realMoney = new double[length];

        //此外还要定义一个状态的数组（表明是否被签收）
        int[] state = new int[length];


        //按照题目要求还需要定义一个订单的数组
        String[] order = new String[length];


        //图形交互界面（吃货联盟主界面）
        System.out.println("欢迎使”用吃货联盟系统“");
        boolean isExit = false;
        for (; ; ) {
            System.out.println("**********吃货联盟主界面**********");
            System.out.println("1.我要订餐");
            System.out.println("2.查看餐袋");
            System.out.println("3.签收订单");
            System.out.println("4.删除订单");
            System.out.println("5.我要点赞");
            System.out.println("6.退出系统");
            System.out.print("请选择：");

            int choose = scan.nextInt();
            boolean isAdd = false;
            switch (choose) {

                case 1://存在的问题。只能输入一个
                    //看是否添加订餐人成功
                    System.out.println("*****我要订餐*****");
                    System.out.print("请输入订餐人姓名：");

                    //找到一个空位置（null）,存放订餐人姓名

                    isAdd = true;
                    int i = 0;
                    for (; i < name.length; i++) {
                        if (name[i] == null) {
                            name[i] = scan.next();
                            isAdd = true;
                            //符合要求时加一，否则的话，后面的人就加不进来了。
                            break;
                        }
                        if (isAdd == false) {
                            System.out.println("添加订餐人失败！");
                            break;
                        }

                    }

                    //展示初始化的菜品信息（展示菜单界面）
                    System.out.println("序号" + "\t" + "菜品名称" + "\t" + "单价" + "\t\t" + "点赞");
                    for (int j = 0; j < food.length; j++) {
                        System.out.println((j + 1) + "\t" + food[j] + "\t" + price[j] + "\t" + likes[j]);
                    }

                    //选择餐单编号（选择错误时提示：重新选择。直到选择正确为止）
                    int foodBH = 0;
                    System.out.print("请选择你要点的菜单编号：");
                    while (true) {
                        foodBH = scan.nextInt();
                        if ((foodBH - 1) < 0 || (foodBH - 1) >= food.length) {//这里的foodBH要减一因为个可看到的，和角标不一样
                            System.out.println("选择错误请重新输入！");
                        } else {
                            break;
                        }
                    }

                    //输入份数：（这里输入的分数我将其创建了一个数组了）
                    boolean isfnum = false;//判断输入的分数是否符合要求
                    int fnum = 0;
                    System.out.print("请输入你要点的份数：");
                    for (; i < fennum.length; i++) {//因为这里在前面定义了一个fennum[]，所以此处就得对应的填写
                        //需不需要判断空？(我认为不需要了，因为前面一开始已经判断了)
                        while (true) {
                            fnum = scan.nextInt();
                            if (fnum < 0) {
                                System.out.println("份数输入有误，请重新输入！");
                            } else {
                                isfnum = true;
                                break;
                            }
                        }
                        if (isfnum == true) {
                            fennum[i] = fnum;
                            break;
                        }
                    }

                    //输入送餐时间（这里输入的分数我将其创建了一个数组了）//需不需要判断空？(我认为不需要了，因为前面一开始已经判断了)
                    boolean isDate = false;//判断输入的分数是否符合要求
                    int time = 0;
                    System.out.println("请输入送餐的时间（送餐时间是10点至20点间整点送餐时间）：");
                    for (; i < sDate.length; i++) {//因为这里在前面定义了一个sDate[]，所以此处就得对应的填写
                        while (true) {
                            time = scan.nextInt();
                            if (time < 10 || time > 20) {
                                System.out.println("时间选择有误，请重新输入！");
                            } else {
                                isDate = true;
                                break;
                            }
                        }
                        if (isDate == true) {
                            sDate[i] = time;
                            break;
                        }
                    }

                    //输入送餐地址（同样需要创建一个数组address[]）//需不需要判断空？(我认为不需要了，因为前面一开始已经判断了)
                    System.out.print("请输入送餐地址：");
                    for (; i < address.length; i++) {
                        address[i] = scan.next();
                        System.out.println("订餐成功！");
                        break;
                    }
                    //输出订单信息：//订餐人 所订餐及份数 时间 送餐地址 状态 价格

                    /*输出定的菜名及其份数（这里将foodBH和需要的分数fennum[]一起输出。
                     个人认为在创建一个foodBH的数组会好一些。。或者将两个信息装到一个数组中）*/

                    double money = 0;//餐费
                    double distribution = 0;//配送费用
                    //（将两个信息装到一个数组中(dishMegs[])
                    for (; i < dishMegs.length; i++) {
                        dishMegs[i] = food[foodBH - 1] + fennum[i] + "份";//这里的food[foodBH-1]是根据顾客选的编号来获取food[]数组中的信息的。
                        // System.out.println(dishMegs[i]);//这里好像有问题，可能会影响到后面的，因为它只加载了一个就会break。！！！!!!!!!!!!!!!!!!!!
                        money = fennum[i] * price[foodBH - 1];
                        if (money >= 50) {
                            distribution = 0;
                        } else {
                            distribution = 5.0;
                        }
                        realMoney[i] = money + distribution;
                        break;
                    }

                    /*//餐费(个人认为这个可以写进上面的for（）循环中)
                    double money=0;//餐费
                    double distribution =0;//配送费用
                    //对餐费的处理计算
                    for(int i=0;i<fennum.length;i++) {
                         money =fennum[i]*price[foodBH-1];
                         break;
                    }
                    //对配送费的处理计算(个人认为这个连带餐费一起写入上面那个for（）循环中)
                    if(money>=50){
                        distribution=0;
                    }else{
                        distribution = 5.0;
                    }

                    //实际支付的费用；
                    double realmoney  = money+distribution;*/

//                   但是这样的话与上面没啥区别了。
                    for (; i < dishMegs.length; i++) {
                        System.out.println("您订的是：" + dishMegs[i]);
                        System.out.println("送餐时间为:" + sDate[i] + "点");
                        System.out.println("餐费为：" + money + ",送餐费" + distribution + ",总计：" + realMoney[i]);
                        break;
                    }
                    break;
                case 2://存在的问题，无法在一开始就将转态表现出来(所以我选择在定义数组的时候就转换一下)
                    System.out.println("*****查看餐袋*****");
                    System.out.println("序号" + "\t" + "订餐人" + "\t\t" + "餐品信息" + "\t\t"
                            + "送餐日期" + "\t\t" + "送餐地址" + "\t\t" + "总金额" + "\t\t" + "订单状态");
                    //初始化订单
                    //订餐人 所订餐及份数 时间 送餐地址 状态 价格
                    for (int j = 0; j < order.length; j++) {
                        String state2 = (state[j] == 0) ? "已预定" : "已完成";
                        order[j] = name[j] + "\t\t\t" + dishMegs[j] + "\t\t\t" + sDate[j] + "\t\t\t"
                                + address[j] + "\t\t" + realMoney[j] + "\t\t" + state2;
                        if (name[0] == null) {
                            System.out.println("没有订餐信息！赶紧订餐哟！");
                            break;
                        } else {
                            if (name[j] != null) {
                                System.out.println((j + 1) + "\t" + order[j]);
                               /* System.out.println((i + 1) + "\t" + name[i] + "\t" + dishMegs[i] + "\t"
                                        + sDate[i] + "\t" + address[i] + "\t" + realMoney[i] + "\t");*/
                            }
                            //break;//这个加了后后面的元素就无法显示
                        }
                    }
                    break;
                case 3://存在问题什么都没有输入的时候，居然可以操作！！！(已解决，出现问题的原因是，前面判断null时用了order[0]==null)
                    //然而用这个的话，是不会为空的。因为order[]数组中有int[]的数组。这样的数组在一开始确定长度时就有默认值了。
                    // 所以order[0]==null是不可能的。解决的办法，判断空时。用name[]去判断
                    System.out.println("*****签收订单*****");
                    if (name[0] == null) {
                        System.out.println("没有订单信息哦！，赶紧去添加订单吧！");
                    } else {
                        System.out.print("请选择要签收的订单：");
                        int orderNum = 0;
                        for (int k = 0; k < order.length; i++) {
                            while (true) {
                                orderNum = scan.nextInt();
                                if (orderNum <= 0 || orderNum > order.length) {
                                    System.out.println("输入有误请，重新输入！");
                                } else if (name[orderNum - 1] != null) {
                                    break;
                                } else {
                                    System.out.println("还没有数据信息哟！重新输入");
                                    while (true) {
                                        orderNum = scan.nextInt();
                                        if (name[orderNum - 1] == null) {
                                            System.out.println("还没有数据信息哟！重新输入");
                                        } else {
                                            break;
                                        }
                                    }
                                }
                                //break;//不需要了
                            }

                            state[orderNum - 1] = 1;//到这里还有一件事儿没有处理，即订单数组order[]还没有处理，仅仅只是定义了长度。(现在处理了)
                            //但是还有一个问题。怎么让它显示：已预订（0），已完成（1）(我选择重新定义一个String类型的数组)
                            // str[k]=(state[k]==1)?"已完成":"已预订";//现将其注释掉，因为在定义数组的时候就转换了(这种说法错误！！)
                            //因为一开始就都是已预订，在这里修改了后就还得修改的！！！

                            /*if(state[i]==1){
                                str[i]= "已完成";
                                break;
                            }else{
                                str[i]="已预订";
                            }*/
                            System.out.println("签收订单成功！");
                            break;
                        }
                    }
                    break;
                case 4://存在问题什么都没有输入的时候，居然可以操作！！！(已解决，出现问题的原因是，前面判断null时用了order[0]==null)
                    //然而用这个的话，是不会为空的。因为order[]数组中有int[]的数组。这样的数组在一开始确定长度时就有默认值了。
                    // 所以order[0]==null是不可能的。解决的办法，判断空时。用name[]去判断
                    System.out.println("*****删除订单*****");
                    if (name[0] == null) {
                        System.out.println("没有订单信息哦！，赶紧去添加订单吧！");
                    } else {
                        System.out.print("请输入要删除的订单编号：");
                        int deNum = 0;
                        for (int k = 0; k < order.length; k++) {
                            while (true) {
                                deNum = scan.nextInt();
                                if (deNum < 0 || deNum > order.length) {
                                    System.out.println("输入错误，请重新输入");
                                } else if (name[deNum - 1] != null) {
                                    break;
                                } else {
                                    System.out.println("还没有数据信息哟！重新输入");
                                    while (true) {
                                        deNum = scan.nextInt();
                                        if (name[deNum - 1] != null) {
                                            break;
                                        }
                                        System.out.println("还没有数据信息哟！重新输入");
                                    }
                                }
                            }

                            if (state[deNum - 1] == 0) {
                                System.out.println("您的订单未签收，不能删除！");//注意一点:其实初始的时候都是0，即都不能删除呀！！
                                //所以在前面就应该把范围给确定！！即代码277行又赋了一个while循环
                                break;
                            } else {
                               /* if (name[deNum - 1] == null && k != 0) {//这里其实大可不必，因为前面就已经将范围画出来了！！！
                                    //System.out.println("此条没有订单信息哟！");
                                    break;
                                } else {*/
                                for (int m = deNum - 1; m < order.length - 1; m++) {//这里的i<order.length - 1.不能写等于！！
                                    //不然的话会越界
                                    order[m] = order[m + 1];//这里要考虑是否会越界
                                    name[m] = name[m + 1];
                                    dishMegs[m] = dishMegs[m + 1];
                                    sDate[m] = sDate[m + 1];
                                    address[m] = address[m + 1];
                                    state[m] = state[m + 1];


                                }
                                order[order.length - 1] = null;
                                name[name.length - 1] = null;
                                dishMegs[name.length - 1] = null;
                                sDate[name.length - 1] = 0;
                                address[name.length - 1] = null;
                                state[name.length - 1] = 0;
                                System.out.println("已经成功删除！");
                                break;
                                // }
                            }
                        }
                    }
                    break;
                case 5:
                    System.out.println("*****我要点赞*****");
                    //展示初始化的菜品信息（展示菜单界面）
                    System.out.println("序号" + "\t" + "菜品名称" + "\t" + "单价" + "\t\t" + "点赞");
                    for (int j = 0; j < food.length; j++) {
                        System.out.println((j + 1) + "\t" + food[j] + "\t" + price[j] + "\t" + likes[j]);
                    }
                    System.out.print("请选择您要点赞的菜品序号：");
//
                    int likeNum = 0;//用户所能看到的序号，从1开始！！
                    for (int k = 0; k < food.length; k++) {
                        while (true) {
                            likeNum = scan.nextInt();
                            if ((likeNum - 1) < 0 || (likeNum - 1) >= food.length) {
                                System.out.println("选择错误，请重新输入！");
                            } else {//这里的else不能省略！！！！！！！！！！！！！！！！！！！
                                break;
                            }
                        }
                        likes[likeNum - 1]++;
                        System.out.println("点赞成功！");
                        break;
                    }
                    break;
                case 6:
                    // System.out.println("*****退出系统*****");
                    isExit = true;
                    break;
            }

            if (isExit == true) {
                System.out.println("退出成功，欢迎下次使用！");
                break;
            } else {
                System.out.print("输入0返回:");
                int zero = scan.nextInt();
                while (zero != 0) {
                    System.out.println("输入错误重新输入！");
                    zero = scan.nextInt();
                }
            }
        }

    }
}
